package socket.test1Base;

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.*;

/**
 * Created by majian8 on 2019/6/22.
 *
 * InetAddress 是定位一个主机的，，URL是定位一个资源的
 */
public class Test2Url {


    /**
     * 用字符串表示一个url会非常简单，但是用Url对象表示更清晰，其实一个final类，不允许修改
     * http协议，可用用这个测试虚拟机支持哪些协议，不支持的协议抛出malFormedUrlEXCEPTION异常
     */
    @Test
    public void test1(){

        try {
            //1,从字符串构造url
            URL url1=new URL("http://www.baidu.com/index.html");
            System.out.println(url1.getHost()+":"+url1.getPath());

            //2,拆开表示  #abc表示index.html中的一个片段 (id="abc" html片段)，使用默认端口80
            System.out.println("222222222222222222222222222");
            URL url2=new URL("http","www.baidu.com","/index.html#abc");
            System.out.println(url1.getHost()+":"+url2.getPath());

            //3,指定端口
            System.out.println("3333333333333333333333333333");
            URL url3=new URL("http","www.baidu.com",8080,"/index.html#abc");
            System.out.println(url1.getHost()+":"+url3.getPath());

            //4,构造相对url,比如 index.html 文档中包含一个相对路径 /query.html,为了构造这个相对路径 query.html
            //就可以如下创建url
            System.out.println("4444444444444444444444444444444");
            URL u1=new URL("http://www.baidu.com/index.html");
            URL u2=new URL(u1,"query.html");
            System.out.println(u2);


        } catch (MalformedURLException e) {
            e.printStackTrace();
        }


    }


    /**
     * 其他返回url的方法(?待办)
     */
    @Test
    public void test2(){
        URL u1=ClassLoader.getSystemResource("base/common/JavaTest.java");
        System.out.println(u1);
        URL u2=Test2Url.class.getClassLoader().getResource("");
        System.out.println(u2);
    }

    /**
     * 1,从URL获取数据 (openStream())
     *
     */
    @Test
    public void test3(){
        try {
            URL u1=new URL("http://baidu.jd.com");
            try(InputStream in= u1.openStream()){
                int len=0;
                byte [] bytes=new byte[2048];
                while((len=in.read(bytes)) !=-1){
                    System.out.println(new String(bytes));
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 2,从URL获取数据 (openConnection())
     *
     * urlconnection除了可以从其中读取数据，还可以向其中写入数据
     */
    @Test
    public void test4(){
        try {
            URL u1=new URL("http://baidu.jd.com");
            URLConnection conn=u1.openConnection();
            InputStream in=conn.getInputStream();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 2,从URL获取数据 (getContent())
     * 返回的是Object对象，可能是字符串，可能是 声音文件等，
     * 需要手动转换为特定类型的文件，
     * url的equal()方法会尝试解析主机，可能会有io阻塞，应当避免将url存储在依赖
     * equqls的数据结构中
     *
     */
    @Test
    public void test5(){
        try {
            URL u1=new URL("https://www.jd.com");
            //getContent会查找从服务器返回的content-type字段， 如果没有就会返回某种 inputStream
            Object object=u1.getContent();
            System.out.println(object.getClass().getName());

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     *  URI 是对url的高层抽象，用法和 url 类似
     */
    @Test
    public void test6(){

    }




    /**
     * url中的字符是有要求的，如果出现一些特殊字符，就要对url进行编码和解码
     */
    @Test
    public void test7(){
        try {
            //字符集最好选择 utf-8
            String u1= URLEncoder.encode("http://www.baid.com/*123abc","utf-8");
            System.out.println(u1);
            //如果不确定那种编码方式就选 utf-8
            String u2= URLDecoder.decode("http%3A%2F%2Fwww.baid.com%2F*123abc","utf-8");
            System.out.println(u2);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }


    /**
     * 代理，使用代理的好处是可以 屏蔽网络的配置秘密，过滤请求，缓存频繁请求的资源
     * 而不必总是从网络上下载
     * URL类可以使用大多数常见的代理服务器，和协议，事实上正是这个原因
     * 我们应该使用 URL类  而不是在原始的 socket 上处理自己的http或者是其他客户端
     */
    @Test
    public void test8(){
        //设置代理服务器的地址
        System.setProperty("http.proxyHost","192.168.1.21");
        //设置代理服务器的端口
        System.setProperty("http.proxyPort","8080");
        //设置哪个网站不被代理（可以是ip）(baidu和jd不会被代理) 还可以是用*号作为通配符
        System.setProperty("http.nonProxyHosts","www.baidu.com|www.jd.com");
        //如果是ftp的话，同样可以通过  ftp.proxyHost   ftp.proxyPort ftp.nonProxyHosts 这三个属性设置

    }




    @Test
    public void test(){

    }



}
